home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
3dshade.exe
/
3DSHADE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-07-22
|
23KB
|
575 lines
#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <graph.h>
#include <process.h>
#include <stdlib.h>
#include <conio.h>
#define TRUE -1
#define FALSE 0
static double f(double,double);
void main(void);
void main()
{
static double aspect_ratio;
static double box_delta_x;
static double box_delta_y;
static int box_num_1;
static int box_num_2;
static int box_x [4];
static double box_x_intercept;
static int box_x1;
static int box_x2;
static int box_y [4];
static int box_y_max;
static int box_y_min;
static double box_y_offset;
static int box_y1;
static short color;
static double cos_rotation;
static double cos_tilt;
static double delta_x;
static double delta_y;
static double delta_z;
static int finished;
static int intercept_count_mod_2;
static int key_index_1;
static int key_index_2;
static int line_x1;
static int line_x2;
static int line_y1;
static int line_y2;
static double magnitude_normal;
static int max_y_out;
static int max_z_out;
static double normal_x;
static double normal_y;
static double normal_z;
static double num_bytes;
static int num_x_divisions;
static int num_x_primes;
static int num_y_divisions;
static double pixels_per_unit;
static int prime_num;
static double radians;
static double radians_per_degree;
static int response;
static double rotation;
static double sin_rotation;
static double sin_tilt;
static int sort_left;
static int sort_right;
static double sort_t1;
static int sort_t2;
static int sort_t3;
static double tilt;
static long tint;
static long tint_increment;
static double x;
static int *x_division_index;
static int x_division_num;
static double x_eye;
static double x_max;
static double x_min;
static double *x_prime;
static double *x_prime_sorted;
static double x_prime_max;
static int x_prime_num;
static double x_rotated;
static double x0;
static double x1;
static double x2;
static double x3;
static double y;
static double y_center;
static int *y_division_index;
static int y_division_num;
static double y_max;
static double y_min;
static double y_offset;
static double y_out_max;
static double *y_prime;
static double y_prime_max;
static double y_prime_min;
static double y0;
static double y1;
static double y2;
static double y3;
static double z;
static double z_center;
static double z_offset;
static double z_out_max;
static double *z_prime;
static double z_prime_max;
static double z_prime_min;
static double z0;
static double z1;
static double z2;
static double z3;
max_y_out=319;
max_z_out=199;
printf(" Three Dimensional Plot\n\n\n\n");
printf("Smallest value for x? "); fflush(stdout);
scanf("%lf",&x_min);
printf("Largest value for x? "); fflush(stdout);
scanf("%lf",&x_max);
printf("Smallest value for y? "); fflush(stdout);
scanf("%lf",&y_min);
printf("Largest value for y? "); fflush(stdout);
scanf("%lf",&y_max);
do
{
do
{
printf("Number of divisions for x? "); fflush(stdout);
scanf("%d",&num_x_divisions);
if (num_x_divisions <= 1)
printf("? there must be at least 2 divisions\n");
}
while (num_x_divisions <= 1);
do
{
printf("Number of divisions for y? "); fflush(stdout);
scanf("%d",&num_y_divisions);
if (num_y_divisions <= 1)
printf("? there must be at least 2 divisions\n");
}
while (num_y_divisions <= 1);
num_bytes=(float) num_x_divisions;
num_bytes*=((float) num_y_divisions);
num_bytes*=((float) sizeof(double));
if (num_bytes > 65536.0)
printf("? too many cells\n"); /* Oh, for a 32 bit compiler! */
}
while (num_bytes > 65536.0);
if ((x_prime
=(double *) malloc(num_x_divisions*num_y_divisions*sizeof(double)))
== NULL)
{
printf("Fatal error: out of memory\n");
exit(4);
}
if ((x_prime_sorted
=(double *) malloc(num_x_divisions*num_y_divisions*sizeof(double)))
== NULL)
{
printf("Fatal error: out of memory\n");
exit(4);
}
if ((y_prime
=(double *) malloc(num_x_divisions*num_y_divisions*sizeof(double)))
== NULL)
{
printf("Fatal error: out of memory\n");
exit(4);
}
if ((z_prime
=(double *) malloc(num_x_divisions*num_y_divisions*sizeof(double)))
== NULL)
{
printf("Fatal error: out of memory\n");
exit(4);
}
if ((x_division_index
=(int *) malloc(num_x_divisions*num_y_divisions*sizeof(int)))
== NULL)
{
printf("Fatal error: out of memory\n");
exit(4);
}
if ((y_division_index
=(int *) malloc(num_x_divisions*num_y_divisions*sizeof(int)))
== NULL)
{
printf("Fatal error: out of memory\n");
exit(4);
}
do
{
printf("Rotation about the z-axis (degrees)? "); fflush(stdout);
scanf("%lf",&rotation);
printf("Tilt about the resulting y-axis (degrees)? "); fflush(stdout);
scanf("%lf",&tilt);
printf("After the plot is displayed, press a key to continue.\n");
printf("Evaluating function...\n");
radians_per_degree=atan(1.0)/45.0;
radians=tilt*radians_per_degree;
cos_tilt=cos(radians);
sin_tilt=sin(radians);
radians=rotation*radians_per_degree;
cos_rotation=cos(radians);
sin_rotation=sin(radians);
z=f(x_min,y_min);
x_rotated=x_min*cos_rotation+y_min*sin_rotation;
y_prime_min=-x_min*sin_rotation+y_min*cos_rotation;
z_prime_min=-x_rotated*sin_tilt+z*cos_tilt;
y_prime_max=y_prime_min;
z_prime_max=z_prime_min;
x_prime_max=x_rotated*cos_tilt+z*sin_tilt;
delta_x=(double) num_x_divisions;
delta_x=(x_max-x_min)/delta_x;
delta_y=(double) num_y_divisions;
delta_y=(y_max-y_min)/delta_y;
x=x_min;
num_x_primes=0;
for (x_division_num=0; x_division_num < num_x_divisions;
x_division_num++)
{
y=y_min;
for (y_division_num=0; y_division_num < num_y_divisions;
y_division_num++)
{
z=f(x,y);
x_division_index[num_x_primes]=x_division_num;
y_division_index[num_x_primes]=y_division_num;
x_rotated=x*cos_rotation+y*sin_rotation;
y_prime[num_x_primes]=-x*sin_rotation+y*cos_rotation;
x_prime[num_x_primes]=x_rotated*cos_tilt+z*sin_tilt;
z_prime[num_x_primes]=-x_rotated*sin_tilt+z*cos_tilt;
if (x_prime[num_x_primes] > x_prime_max)
x_prime_max=x_prime[num_x_primes];
if (y_prime[num_x_primes] < y_prime_min)
y_prime_min=y_prime[num_x_primes];
if (y_prime[num_x_primes] > y_prime_max)
y_prime_max=y_prime[num_x_primes];
if (z_prime[num_x_primes] < z_prime_min)
z_prime_min=z_prime[num_x_primes];
if (z_prime[num_x_primes] > z_prime_max)
z_prime_max=z_prime[num_x_primes];
y+=delta_y;
num_x_primes++;
}
x+=delta_x;
}
printf("Adjusting perspective...\n");
if ((y_prime_max-y_prime_min) > (z_prime_max-z_prime_min))
x_eye=2.0